home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / otohime / src / lib / trem.asm < prev    next >
Assembly Source File  |  1994-06-01  |  5KB  |  205 lines

  1. ;    PCM SOUND TREMOLO
  2. ;
  3. ;    call from F-BASIC386
  4. ;    callm address,varptr(snd.data),varptr(para),varptr(work area)
  5. ;
  6. ;
  7. ;        1990 3  Hiroshi TODA
  8. ;
  9. ;        1993 12 High C 用に改造
  10. ;
  11. ;    para:mix1(main)*256,mix2(tremolo)*256,speed,start-phase
  12. ;
  13.  
  14.  
  15.     .386p
  16.  
  17.  
  18. param    struc
  19.  
  20.     dd    ?
  21.     dd    ?
  22. sndadd    dd    ?        ; snd.data address
  23. paradd    dd    ?        ; para. address
  24. wadd    dd    ?         ; work address
  25.  
  26. param   ends
  27.  
  28.  
  29. work    struc
  30.  
  31. ;data area
  32.  
  33. mix1    dd    ?        ; main mix rate
  34. mix2    dd    ?        ; tremolo mix rate
  35. sp1    dd    ?        ; speed (90 = 10000H)
  36. ang1    dd    ?        ; phase
  37.  
  38. buf1    dd    ?        ; buf.
  39. buf2    dd    ?
  40.  
  41. work    ends
  42.  
  43.  
  44. cseg    segment    dword public use32 'CODE'
  45.     assume    cs:cseg,ds:cseg
  46.  
  47.     public    sndTremolo
  48.     db    'sndTremolo',10
  49. sndTremolo    proc    near
  50.     push    ebp
  51.     mov    ebp,esp
  52.     push    esi
  53.     push    edi
  54.     push    ebx
  55.  
  56.     mov    esi,[ebp].wadd        ; esi <-- work area top add
  57.     mov    edi,[ebp].sndadd    ; edi <-- snd.data add.
  58.     mov    ecx,[ebp].paradd    ; ecx <-- para. add.
  59.     xor    edx,edx            ; edx=count
  60. main01:    mov    eax,[ecx][edx*4]    ; para. --> work area
  61.     mov    [esi][edx*4],eax
  62.     inc    edx
  63.     cmp    edx,4
  64.     jb    main01
  65.     mov    ecx,[edi+12]        ; length
  66.     cmp    ecx,0
  67.     je    mainE
  68.     add    edi,32
  69.  
  70. main02:    call    red            ; read
  71.     mov    [esi].buf1,eax
  72.     mov    eax,[esi].ang1        ; cal. sin
  73.     call    sin            ; eax = sin(eax)*10000H
  74.     add    eax,10000H
  75.     sar    eax,1
  76.     jns    main03
  77.     xor    eax,eax
  78. main03:    imul    eax,[esi].buf1
  79.     sar    eax,16
  80.     imul    eax,[esi].mix2
  81.     mov    [esi].buf2,eax
  82.     mov    eax,[esi].buf1
  83.     imul    eax,[esi].mix1
  84.     add    eax,[esi].buf2
  85.     sar    eax,8
  86.     js    main04            ; eax --> pcm data
  87.     je    main04
  88.     cmp    eax,128            ; +
  89.     jb    main05
  90.     mov    eax,127
  91.     jmp    main05
  92. main04:    mov    edx,eax            ; -
  93.     mov    eax,128
  94.     sub    eax,edx
  95.     cmp    eax,256-1    ; data255はloopStopの意味があるから除外 1993 12
  96.     jb    main05
  97.     mov    eax,255-1    ; data255はloopStopの意味があるから除外 1993 12
  98. main05:    mov    [edi],al
  99.  
  100.     mov    eax,[esi].sp1
  101.     add    [esi].ang1,eax
  102.     inc    edi
  103.     dec    ecx
  104.     jne    main02
  105.  
  106. mainE:
  107.     pop    ebx
  108.     pop    edi
  109.     pop    esi
  110.     mov    esp,ebp
  111.     pop    ebp
  112.     ret
  113.  
  114. ;    READ PCM DATA [edi]--> eax(sign)
  115.  
  116. red:    mov    al,[edi]
  117.     and    eax,0ffH
  118.     cmp    eax,128
  119.     jb    red01
  120.     mov    edx,eax
  121.     mov    eax,128
  122.     sub    eax,edx
  123. red01:    ret
  124.  
  125. ;    SIN    10000H*sin(eax/10000H*3.14/2) --> eax(sign)
  126.  
  127. sin:    push    ebx
  128.     push    ecx
  129.     push    edx
  130.     mov    edx,eax
  131.     and    edx,30000H
  132.     cmp    edx,10000H
  133.     je    sin01
  134.     cmp    edx,30000H
  135.     je    sin01
  136.     jmp    sin02
  137. sin01:    mov    bx,ax
  138.     mov    ax,0ffffH
  139.     sub    ax,bx
  140. sin02:    and    eax,0ffffH
  141.     call    sin03
  142. sin03:    pop    ecx
  143.     add    ecx,sintb-sin03
  144.     push    eax
  145.     shr    eax,8
  146.     mov    bx,cs:[ecx][eax*2]
  147.     mov    cx,cs:[ecx+2][eax*2]
  148.     and    ebx,0ffffH
  149.     and    ecx,0ffffH
  150.     sub    ecx,ebx
  151.     pop    eax
  152.     and    eax,0ffH
  153.     imul    eax,ecx
  154.     shr    eax,8
  155.     add    eax,ebx
  156.     cmp    edx,20000H
  157.     jb    sin04
  158.     mov    ebx,eax
  159.     xor    eax,eax
  160.     sub    eax,ebx
  161. sin04:    pop    edx
  162.     pop    ecx
  163.     pop    ebx
  164.     ret
  165.  
  166. sintb    dw    00000H,00192H,00324H,004B6H,00648H,007DAH,0096CH,00AFDH
  167.     dw    00C8FH,00E21H,00FB2H,01143H,012D5H,01465H,015F6H,01787H
  168.     dw    01917H,01AA7H,01C37H,01DC6H,01F56H,020E5H,02273H,02402H
  169.     dw    0250FH,0271DH,028AAH,02A37H,02BC3H,02D4FH,02EDBH,03066H
  170.     dw    031F1H,0337BH,03505H,0368EH,03816H,0399EH,03B26H,03CADH
  171.     dw    03E33H,03FB9H,0413EH,042C3H,04447H,045CAH,0474CH,048CEH
  172.     dw    04A4FH,04BD0H,04D4FH,04ECEH,0504DH,051CAH,05347H,054C3H
  173.     dw    0563EH,057B8H,05931H,05AAAH,05C21H,05D98H,05F0EH,06083H
  174.     dw    061F7H,0636AH,064DCH,0664DH,067BDH,0692CH,06A9AH,06C07H
  175.     dw    06D73H,06EDEH,07048H,071B1H,07319H,0747FH,075E5H,07749H
  176.     dw    078ACH,07A0FH,07B64H,07CCFH,07E2EH,07F8DH,080E7H,08242H
  177.     dw    0839BH,084F3H,0864AH,087A0H,088F5H,08A48H,08B99H,08CEAH
  178.     dw    08E39H,08F86H,090D3H,0921EH,09367H,094AFH,095F6H,0973BH
  179.     dw    0987FH,099C1H,09B02H,09C41H,09D7FH,09EBBH,09FF6H,0A12FH
  180.     dw    0A266H,0A39CH,0A4D1H,0A604H,0A735H,0A865H,0A993H,0AABFH
  181.     dw    0ABEAH,0AD13H,0AE3BH,0AF60H,0B085H,0B1A7H,0B2C8H,0B3E6H
  182.     dw    0B504H,0B61FH,0B739H,0B851H,0B967H,0BA7BH,0BB8EH,0BC9FH
  183.     dw    0BDAEH,0BEBBH,0BFC6H,0C0D0H,0C1D7H,0C2DDH,0C3E1H,0C4E3H
  184.     dw    0C5E3H,0C6E1H,0C7DDH,0C8D7H,0C9D0H,0CAC6H,0CBBBH,0CCADH
  185.     dw    0CD9EH,0CE8CH,0CF79H,0D063H,0D14CH,0D232H,0D317H,0D3F9H
  186.     dw    0D4DAH,0D5B8H,0D695H,0D76FH,0D847H,0D91DH,0D9F1H,0DAC3H
  187.     dw    0DB93H,0DC60H,0DD2CH,0DDF5H,0DEBDH,0DF82H,0E045H,0E106H
  188.     dw    0E1C4H,0E281H,0E33BH,0E3F3H,0E4A9H,0E55DH,0E60EH,0E6BDH
  189.     dw    0E76AH,0E815H,0E8BEH,0E964H,0EA08H,0EAAAH,0EB4AH,0EBE7H
  190.     dw    0EC82H,0ED1BH,0EDB1H,0EE45H,0EED7H,0EF67H,0EFF4H,0F07FH
  191.     dw    0F108H,0F18EH,0F212H,0F293H,0F313H,0F390H,0F40AH,0F483H
  192.     dw    0F4F9H,0F56CH,0F5DDH,0F64CH,0F6B9H,0F723H,0F78AH,0F7F0H
  193.     dw    0F852H,0F8B3H,0F911H,0F96DH,0F9C6H,0FA1DH,0FA72H,0FAC4H
  194.     dw    0FB13H,0FB60H,0FBABH,0FBF4H,0FC3AH,0FC7DH,0FCBEH,0FCFDH
  195.     dw    0FD39H,0FD73H,0FDAAH,0FDDFH,0FE12H,0FE42H,0FE6FH,0FE9AH
  196.     dw    0FEC3H,0FEE9H,0FF0DH,0FF2EH,0FF2EH,0FF4DH,0FF83H,0FF9BH
  197.     dw    0FFB0H,0FFC2H,0FFD2H,0FFE0H,0FFEBH,0FFF3H,0FFFAH,0FFFDH
  198.     dw    0FFFFH
  199.  
  200. sndTremolo    endp
  201.  
  202. cseg    ends
  203.     end
  204.